#include <my_header.h>
// 优雅地处理用户的终止和退出请求。
// 
/* Usage: ./14_sigsuspend */
// 处理 SIGINT 信号的函数  
void func1(int sig_value) {  
    printf("sigint \n");  // 当捕获到 SIGINT 时，打印信息  
}  

// 处理 SIGQUIT 信号的函数  
void func2(int sig_value) {  
    printf("sigquit \n"); // 当捕获到 SIGQUIT 时，打印信息  
}  

int main(int argc, char* argv[]) {  
    // 注册信号处理函数  
    signal(SIGINT, func1);   // 当接收到 SIGINT 信号时调用 func1  
    signal(SIGQUIT, func2);  // 当接收到 SIGQUIT 信号时调用 func2  

    sigset_t set1, set2;     // 定义两个信号集  

    // 初始化信号集 set1  
    sigemptyset(&set1);      // 设置 set1 为一个空集合  
    sigaddset(&set1, SIGINT); // 向 set1 中添加 SIGINT 信号  

    // 屏蔽 SIGINT 信号  
    sigprocmask(SIG_BLOCK, &set1, NULL); // 将 set1 中的信号（SIGINT）添加到当前进程的信号屏蔽字中  

    // 初始化信号集 set2  
    sigemptyset(&set2);      // 设置 set2 为一个空集合  
    sigaddset(&set2, SIGQUIT); // 向 set2 中添加 SIGQUIT 信号  

    // 进入等待状态，此时会屏蔽 SIGQUIT 信号  
    sigsuspend(&set2);      // 等待接收信号，直到捕获到未被屏蔽的信号  

    // 进入无限循环，每秒打印一次信息  
    while (1) {  
        sleep(1);            // 暂停 1 秒  
        printf(" -- \n");    // 打印信息  
    }  

    return 0;               // 程序正常结束  
}

#if 0
    sigsuspend函数用于原子地更改进程的信号屏蔽字(block mask)
并挂起进程执行，直到捕获到一个信号。(man sigsuspend )
更改信号掩码和挂起进程之间提供原子操作

·在sigsuspend返回后，进程的信号掩码会自动恢复到调用
sigsuspend之前的状态

#include <signal.h>
// wait for a signa]
int sigsuspend(
const sigset_t*mask // 指定了在挂起期间要设置的新信号
掩码
#endif
